package com.h5lib.nchuoffice;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.h5lib.nchuoffice.app.dao.Cache;
import com.h5lib.nchuoffice.app.dao.CacheDao;
import com.h5lib.server.Di;


/**
 * 
 * @author framer
 *
 */
public class CacheManager{
	
	/**
	 * 数据
	 */
	private static Map<String, Object> data = new HashMap<String, Object>();
	/**
	 * 
	 */
	private static CacheDao cacheDao = null;
	
	/**
	 * 是否离线模式，离线为使用数据库缓存
	 */
	public static boolean isOff = false;
	
	private CacheManager(){
		
	}
	
	/**
	 * 离线模式需要从数据库初始化缓存
	 */
	public static void loadCacheFromDb(){
		try {
			if(cacheDao == null){
				cacheDao = (CacheDao) Di.CoreConfig.IOC.get(CacheDao.class);
			}
			List<Cache> caches = cacheDao.getCaches();
			for (Cache cache : caches) {
				Object o = JSON.parseObject(cache.getValue(), Class.forName(cache.getClazz()));
				data.put(cache.getKey(), o);
			}
			isOff = true;
		} catch (Exception e) {
			e.printStackTrace();
			isOff = false;
		}

	}

	/**
	 * 通过前缀载入缓存
	 * @param prefixs
	 * 	缓存前缀列表
	 */
	public static void loadCacheFromDbByPrefixs(String[] prefixs) {
		try {
			if(cacheDao == null){
				cacheDao = (CacheDao) Di.CoreConfig.IOC.get(CacheDao.class);
			}
			List<Cache> caches = cacheDao.getCaches();
			for (Cache cache : caches) {
				if(startsWith(cache.getKey(),prefixs)){
					Object o = JSON.parseObject(cache.getValue(), Class.forName(cache.getClazz()));
					data.put(cache.getKey(), o);
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 以什么开头
	 * @param key
	 * @param prefixs
	 * @return
	 */
	private static boolean startsWith(String key ,String[] prefixs){
		for (String prefix : prefixs) {
			if(key.startsWith(prefix)){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 获取数据
	 * @param key
	 * @return
	 */
	public static Object getCache(String key){
		return data.get(key);
	}
	
	/**
	 * 添加数据
	 * @param key
	 * @param value
	 */
	public static void addCache(String key , Object value){
		data.put(key, value);
		if(!isOff){		//在线模式才要更新缓存
			if(cacheDao == null){
				cacheDao = (CacheDao) Di.CoreConfig.IOC.get(CacheDao.class);
			}
			Cache cache = new Cache();
			try {
				cache.setKey(key);
				cache.setValue(JSON.toJSONString(value));
				cache.setClazz(value.getClass().getName());
				cacheDao.saveOrUpdate(cache);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 清除全部缓存
	 */
	public static void clear(){
		data.clear();
		isOff = false;
	}
	
}
